{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Helpful Links: Where the Data Lives**\n",
    "\n",
    "Open Academic Society: [Project Page](https://www.openacademic.ai/oag/)\n",
    "\n",
    "Microsoft Research: [MS Academic Graph](https://www.microsoft.com/en-us/research/project/microsoft-academic-graph/)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20000, 19)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_df = pd.read_json('data/mag_papers_0/mag_subset20K.txt', lines=True)\n",
    "\n",
    "model_df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['abstract', 'authors', 'doc_type', 'doi', 'fos', 'id', 'issue',\n",
       "       'keywords', 'lang', 'n_citation', 'page_end', 'page_start', 'publisher',\n",
       "       'references', 'title', 'url', 'venue', 'volume', 'year'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_df.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10399, 6)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# filter out non-English articles\n",
    "# keep abstract, authors, fos, keywords, year, title\n",
    "model_df = model_df[model_df.lang == 'en'].drop_duplicates(subset = 'title', \n",
    "                                                           keep = 'first').drop(['doc_type', \n",
    "                                                                                                   'doi', 'id', \n",
    "                                                                                                   'issue', 'lang', \n",
    "                                                                                                   'n_citation', \n",
    "                                                                                                   'page_end', \n",
    "                                                                                                   'page_start', \n",
    "                                                                                                   'publisher', \n",
    "                                                                                                   'references',\n",
    "                                                                                                   'url', 'venue', \n",
    "                                                                                                   'volume'], axis=1)\n",
    "\n",
    "model_df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>abstract</th>\n",
       "      <th>authors</th>\n",
       "      <th>fos</th>\n",
       "      <th>keywords</th>\n",
       "      <th>title</th>\n",
       "      <th>year</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A system and method for maskless direct write ...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>[Electronic engineering, Computer hardware, En...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>System and Method for Maskless Direct Write Li...</td>\n",
       "      <td>2015</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>[{'name': 'Ahmed M. Alluwaimi'}]</td>\n",
       "      <td>[Biology, Virology, Immunology, Microbiology]</td>\n",
       "      <td>[paratuberculosis, of, subspecies, proceedings...</td>\n",
       "      <td>The dilemma of the Mycobacterium avium subspec...</td>\n",
       "      <td>2016</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                            abstract  \\\n",
       "0  A system and method for maskless direct write ...   \n",
       "1                                                NaN   \n",
       "\n",
       "                            authors  \\\n",
       "0                               NaN   \n",
       "1  [{'name': 'Ahmed M. Alluwaimi'}]   \n",
       "\n",
       "                                                 fos  \\\n",
       "0  [Electronic engineering, Computer hardware, En...   \n",
       "1      [Biology, Virology, Immunology, Microbiology]   \n",
       "\n",
       "                                            keywords  \\\n",
       "0                                                NaN   \n",
       "1  [paratuberculosis, of, subspecies, proceedings...   \n",
       "\n",
       "                                               title  year  \n",
       "0  System and Method for Maskless Direct Write Li...  2015  \n",
       "1  The dilemma of the Mycobacterium avium subspec...  2016  "
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_df.head(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# (1) raw data > algorithm w/ XKCD comic"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Content Based Recommendation using cosine similarity"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "How to go about building a recommender system? \n",
    "\n",
    "Let's start simple with a few fields. We'll calculate the cosine similarity between two items, then rank the results to choose a \"most similar\" paper for each input."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can already see that this dataset will need some wrangling. Lists and dictionaries are good for data storage, but not [tidy](http://vita.had.co.nz/papers/tidy-data.html) or well-suited for machine learning without some unpacking."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7760"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "unique_fos = sorted(list({ feature\n",
    "                          for paper_row in model_df.fos.fillna('0')\n",
    "                          for feature in paper_row }))\n",
    "\n",
    "unique_year = sorted(model_df['year'].astype('str').unique())\n",
    "\n",
    "len(unique_fos + unique_year)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8666"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_df.shape[0] - pd.isnull(model_df['fos']).sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7604"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(unique_fos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Call control',\n",
       " 'Coupling constant',\n",
       " 'Evapotranspiration',\n",
       " 'Hash function',\n",
       " 'IVMS',\n",
       " 'Meditation',\n",
       " 'Pareto analysis',\n",
       " 'Second-generation wavelet transform',\n",
       " 'Slip',\n",
       " 'Spiral galaxy',\n",
       " 'Subthreshold slope',\n",
       " 'TCP Westwood',\n",
       " 'Time of arrival',\n",
       " 'de Sitter–Schwarzschild metric',\n",
       " 'route']"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import random\n",
    "[unique_fos[i] for i in sorted(random.sample(range(len(unique_fos)), 15)) ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def feature_array(x, unique_array):\n",
    "    row_dict = {}\n",
    "    for i in x.index:\n",
    "        var_dict = {}\n",
    "        \n",
    "        for j in range(len(unique_array)):\n",
    "            if type(x[i]) is list:\n",
    "                if unique_array[j] in x[i]:\n",
    "                    var_dict.update({unique_array[j]: 1})\n",
    "                else:\n",
    "                    var_dict.update({unique_array[j]: 0})\n",
    "            else:    \n",
    "                if unique_array[j] == str(x[i]):\n",
    "                    var_dict.update({unique_array[j]: 1})\n",
    "                else:\n",
    "                    var_dict.update({unique_array[j]: 0})\n",
    "        \n",
    "        row_dict.update({i : var_dict})\n",
    "    \n",
    "    feature_df = pd.DataFrame.from_dict(row_dict, dtype='str').T\n",
    "    \n",
    "    return feature_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 36.8 s, sys: 314 ms, total: 37.1 s\n",
      "Wall time: 37.5 s\n"
     ]
    }
   ],
   "source": [
    "%time year_features = feature_array(model_df['year'], unique_year)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 27min 46s, sys: 11.6 s, total: 27min 58s\n",
      "Wall time: 28min 26s\n",
      "Size of fos feature array:  2530632380\n"
     ]
    }
   ],
   "source": [
    "%time fos_features = feature_array(model_df['fos'], unique_fos)\n",
    "\n",
    "from sys import getsizeof\n",
    "print('Size of fos feature array: ', getsizeof(fos_features))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7760"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "year_features.shape[1] + fos_features.shape[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 14.4 s, sys: 1.43 s, total: 15.8 s\n",
      "Wall time: 16.3 s\n",
      "Size of first feature array:  2583077234\n"
     ]
    }
   ],
   "source": [
    "# now looking at 10399 x  7760 array for our feature space\n",
    "\n",
    "%time first_features = fos_features.join(year_features).T\n",
    "\n",
    "first_size = getsizeof(first_features)\n",
    "\n",
    "print('Size of first feature array: ', first_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see how our current features perform at giving us a good recommendation. We'll define a \"good\" recommendation as a paper that looks similar to the input."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will start with a simple example of building a recommender with just a few fields, building sparse arrays of available features to calculate for the cosine similary between papers. We will see if reasonably similar papers can be found in a timely manner."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(7760, 10399)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "first_features.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>5</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>...</th>\n",
       "      <th>19985</th>\n",
       "      <th>19986</th>\n",
       "      <th>19987</th>\n",
       "      <th>19988</th>\n",
       "      <th>19993</th>\n",
       "      <th>19994</th>\n",
       "      <th>19995</th>\n",
       "      <th>19997</th>\n",
       "      <th>19998</th>\n",
       "      <th>19999</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0-10 V lighting control</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1/N expansion</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10G-PON</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14-3-3 protein</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 10399 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                        0     1     2     5     7     8     9     10    11     \\\n",
       "0                           0     0     0     0     0     0     0     0     0   \n",
       "0-10 V lighting control     0     0     0     0     0     0     0     0     0   \n",
       "1/N expansion               0     0     0     0     0     0     0     0     0   \n",
       "10G-PON                     0     0     0     0     0     0     0     0     0   \n",
       "14-3-3 protein              0     0     0     0     0     0     0     0     0   \n",
       "\n",
       "                        12     ...  19985 19986 19987 19988 19993 19994 19995  \\\n",
       "0                           0  ...      0     0     0     0     0     0     0   \n",
       "0-10 V lighting control     0  ...      0     0     0     0     0     0     0   \n",
       "1/N expansion               0  ...      0     0     0     0     0     0     0   \n",
       "10G-PON                     0  ...      0     0     0     0     0     0     0   \n",
       "14-3-3 protein              0  ...      0     0     0     0     0     0     0   \n",
       "\n",
       "                        19997 19998 19999  \n",
       "0                           0     0     0  \n",
       "0-10 V lighting control     0     0     0  \n",
       "1/N expansion               0     0     0  \n",
       "10G-PON                     0     0     0  \n",
       "14-3-3 protein              0     0     0  \n",
       "\n",
       "[5 rows x 10399 columns]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "first_features.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from scipy.spatial.distance import cosine\n",
    "\n",
    "def item_collab_filter(features_df):\n",
    "    item_similarities = pd.DataFrame(index = features_df.columns, columns = features_df.columns)\n",
    "    \n",
    "    for i in features_df.columns:\n",
    "        for j in features_df.columns:\n",
    "            item_similarities.loc[i][j] = 1 - cosine(features_df[i], features_df[j])\n",
    "    \n",
    "    return item_similarities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 7min 53s, sys: 2.32 s, total: 7min 55s\n",
      "Wall time: 8min\n"
     ]
    }
   ],
   "source": [
    "%time first_items = item_collab_filter(first_features.loc[:, 0:1000])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We need to get a better idea of how these features will translate to us getting a good recommendation. Do we have enough observations to move forward? Let's plot a heatmap to see if we have any papers that are similar to each other."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x120982710>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.set()\n",
    "ax = sns.heatmap(first_items.fillna(0), \n",
    "                 vmin=0, vmax=1, \n",
    "                 cmap=\"YlGnBu\", \n",
    "                 xticklabels=250, yticklabels=250)\n",
    "ax.tick_params(labelsize=12)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def paper_recommender(paper_index, items_df):\n",
    "    print('Based on the paper: \\nindex = ', paper_index)\n",
    "    print(model_df.iloc[paper_index])\n",
    "    top_results = items_df.loc[paper_index].sort_values(ascending=False).head(4)\n",
    "    print('\\nTop three results: ') \n",
    "    order = 1\n",
    "    for i in top_results.index.tolist()[-3:]:\n",
    "        print(order,'. Paper index = ', i)\n",
    "        print('Similarity score: ', top_results[i])\n",
    "        print(model_df.iloc[i], '\\n')\n",
    "        if order < 5: order += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Based on the paper: \n",
      "index =  2\n",
      "abstract                                                  NaN\n",
      "authors     [{'name': 'Jovana P. Lekovich', 'org': 'Weill ...\n",
      "fos                                                       NaN\n",
      "keywords                                                  NaN\n",
      "title       Should endometriosis be an indication for intr...\n",
      "year                                                     2015\n",
      "Name: 2, dtype: object\n",
      "\n",
      "Top three results: \n",
      "1 . Paper index =  2\n",
      "Similarity score:  1.0\n",
      "abstract                                                  NaN\n",
      "authors     [{'name': 'Jovana P. Lekovich', 'org': 'Weill ...\n",
      "fos                                                       NaN\n",
      "keywords                                                  NaN\n",
      "title       Should endometriosis be an indication for intr...\n",
      "year                                                     2015\n",
      "Name: 2, dtype: object \n",
      "\n",
      "2 . Paper index =  292\n",
      "Similarity score:  1.0\n",
      "abstract                                                  NaN\n",
      "authors     [{'name': 'John C. Newton'}, {'name': 'Beers M...\n",
      "fos         [Wide area multilateration, Maneuvering speed,...\n",
      "keywords                                                  NaN\n",
      "title                    Automatic speed control for aircraft\n",
      "year                                                     1955\n",
      "Name: 561, dtype: object \n",
      "\n",
      "3 . Paper index =  593\n",
      "Similarity score:  1.0\n",
      "abstract    This paper demonstrates that on‐site greywater...\n",
      "authors     [{'name': 'Eran Friedler', 'org': 'Division of...\n",
      "fos         [Public opinion, Environmental Engineering, Wa...\n",
      "keywords    [economic analysis, tratamiento desperdicios, ...\n",
      "title       The water saving potential and the socio-econo...\n",
      "year                                                     2008\n",
      "Name: 1152, dtype: object \n",
      "\n"
     ]
    }
   ],
   "source": [
    "paper_recommender(2, first_items)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
